// AI服务模块 - 支持豆包AI接口
const axios = require('axios');

class AIService {
  constructor() {
    // 豆包API配置
    this.douBaoConfig = {
      url: 'https://api.doubao.com/v1/chat/completions', // 豆包API地址
      apiKey: process.env.DOUBAO_API_KEY || 'your-api-key', // 豆包API密钥
      model: 'doubao-pro' // 豆包模型名称
    };
    
    // 内置智能回复系统（备用方案）
    this.skillResponses = {
      '电脑维修': {
        keywords: {
          '显卡': [
            '显卡问题通常有几种可能：\n1. 驱动问题 - 建议更新或重新安装显卡驱动\n2. 硬件故障 - 需要检查显卡是否松动或损坏\n3. 散热问题 - 清理显卡风扇和散热器\n\n您能详细描述一下具体的故障现象吗？比如是否有花屏、黑屏、或者游戏卡顿等情况？',
            '显卡维修是我的专长！根据您的描述，我建议按以下步骤排查：\n1. 首先检查显卡驱动是否最新\n2. 测试显卡是否松动，重新插拔\n3. 清理显卡散热器和风扇\n4. 如果问题持续，可能需要专业检测\n\n您能告诉我显卡的具体型号和故障表现吗？'
          ],
          '蓝屏': [
            '蓝屏问题可能由多种原因引起：\n1. 内存问题 - 建议运行内存诊断工具\n2. 驱动冲突 - 检查最近安装的软件或驱动\n3. 系统文件损坏 - 运行系统修复命令\n4. 硬件故障 - 检查硬盘和内存条\n\n您能告诉我蓝屏时显示的错误代码吗？这样我可以提供更精确的解决方案。',
            '蓝屏是常见的系统问题，我来帮您分析！\n1. 首先记录蓝屏错误代码\n2. 检查内存条是否松动或损坏\n3. 更新或回滚最近安装的驱动\n4. 运行系统修复：sfc /scannow\n\n您最近是否安装了新软件或更新了驱动？'
          ],
          '开机': [
            '开机问题需要系统排查：\n1. 检查电源连接和电源适配器\n2. 测试内存条是否松动或损坏\n3. 检查主板状态和BIOS设置\n4. 检查硬盘连接和系统文件\n\n建议按步骤逐一排查。您能描述一下开机时的具体表现吗？比如是否有声音、指示灯状态等？',
            '开机故障我来帮您解决！\n1. 检查电源线是否连接牢固\n2. 尝试重新插拔内存条\n3. 检查主板电池是否需要更换\n4. 如果以上都正常，可能需要专业检测\n\n您的电脑是什么品牌和型号？这样我可以提供更具体的建议。'
          ],
          '慢': [
            '电脑变慢通常是因为：\n1. 系统垃圾过多 - 建议清理临时文件和缓存\n2. 启动项过多 - 禁用不必要的开机启动项\n3. 硬件老化 - 考虑升级内存或更换SSD\n4. 病毒或恶意软件 - 运行安全扫描\n\n我来帮您制定优化方案。您主要用电脑做什么？这样我可以提供针对性的建议。',
            '系统变慢我来帮您优化！\n1. 清理系统垃圾和临时文件\n2. 优化启动项，禁用不必要的程序\n3. 检查硬盘空间，清理大文件\n4. 考虑升级内存或更换SSD\n\n您的电脑配置如何？我可以根据配置提供具体的升级建议。'
          ],
          '死机': [
            '电脑死机问题需要全面排查：\n1. 检查CPU和显卡温度是否过高\n2. 测试内存条是否稳定\n3. 检查硬盘是否有坏道\n4. 更新或回滚系统驱动\n\n您能告诉我死机时的具体情况吗？比如是在运行什么程序时发生的？',
            '死机问题我来帮您诊断！\n1. 首先检查散热，清理风扇灰尘\n2. 测试内存稳定性\n3. 检查硬盘健康状况\n4. 更新系统驱动\n\n死机是突然发生还是逐渐变慢后死机？这个信息对诊断很重要。'
          ]
        },
        general: [
          '您好！我是专业的电脑维修师，有5年以上的维修经验。我可以帮您解决各种电脑问题，包括硬件故障、系统问题、软件冲突等。请详细描述一下您遇到的问题，我会为您提供专业的解决方案。',
          '电脑维修是我的专长！我擅长诊断和解决各种电脑故障，从简单的软件问题到复杂的硬件故障都能处理。请告诉我您的具体问题，我会根据您的描述制定合适的维修方案。',
          '很高兴为您提供电脑维修服务！我拥有丰富的实战经验，可以帮您快速定位和解决问题。请详细描述一下故障现象，比如什么时候开始出现问题的，有什么具体表现等。'
        ]
      },
      '英语辅导': {
        keywords: {
          '口语': [
            '口语练习需要系统性的方法：\n1. 每日朗读练习 - 选择适合的材料，模仿标准发音\n2. 参加英语角或找语伴 - 创造实际交流机会\n3. 使用语音识别APP - 练习发音准确性\n4. 观看英语视频 - 学习地道的表达方式\n\n我建议从基础发音开始，逐步提升。您目前的英语水平如何？我可以为您制定个性化的口语训练计划。',
            '口语提升我来帮您规划！\n1. 从音标开始，打好发音基础\n2. 每日朗读15-30分钟\n3. 模仿英语电影或新闻\n4. 参加英语角或线上交流\n\n您希望重点提高哪个方面？日常交流、商务英语还是考试口语？'
          ],
          '语法': [
            '语法学习建议：\n1. 掌握基础语法规则 - 从简单句到复合句\n2. 多做练习题 - 巩固知识点\n3. 在实际交流中运用 - 学以致用\n4. 使用语法检查工具 - 及时发现错误\n\n我可以为您详细讲解语法要点，并提供针对性的练习。您对哪些语法点比较困惑？',
            '语法学习我来帮您系统化！\n1. 从基础语法开始，循序渐进\n2. 多做练习，巩固知识点\n3. 在实际写作和口语中运用\n4. 定期复习，避免遗忘\n\n您希望重点学习哪个语法方面？时态、从句还是其他？'
          ],
          '听力': [
            '听力训练方法：\n1. 听英语新闻 - 从慢速开始，逐步提高\n2. 看英语电影 - 选择有字幕的，反复听\n3. 使用听力APP - 选择适合的难度\n4. 练习听写 - 提高理解能力\n\n建议从慢速英语开始练习，培养语感。您喜欢什么类型的听力材料？我可以为您推荐合适的资源。',
            '听力提升我来帮您规划！\n1. 从慢速英语开始，培养语感\n2. 选择感兴趣的材料，提高学习兴趣\n3. 练习听写，提高理解能力\n4. 定期测试，跟踪进步\n\n您目前的听力水平如何？我可以为您推荐适合的材料。'
          ],
          '考试': [
            '考试准备需要针对性训练：\n1. 了解考试格式和要求\n2. 制定详细的复习计划\n3. 重点突破薄弱环节\n4. 模拟考试练习\n\n我可以根据考试类型，为您制定复习计划，包括词汇、语法、听力、阅读等各个方面。您准备参加什么考试？',
            '考试辅导我来帮您规划！\n1. 分析考试要求和重点\n2. 制定个性化复习计划\n3. 重点突破薄弱环节\n4. 提供模拟练习和技巧\n\n您准备参加什么考试？我可以为您提供针对性的辅导。'
          ],
          '单词': [
            '单词记忆方法：\n1. 词根词缀法 - 理解单词构成规律\n2. 联想记忆法 - 创造有趣的联想\n3. 语境记忆法 - 在句子中学习单词\n4. 复习巩固法 - 定期复习避免遗忘\n\n我建议结合多种方法，提高记忆效率。您觉得哪种方法比较适合您？',
            '单词记忆我来教您高效方法！\n1. 学习词根词缀，理解单词规律\n2. 创造联想，提高记忆效果\n3. 在语境中学习，加深理解\n4. 定期复习，巩固记忆\n\n您希望重点记忆哪类单词？我可以为您制定记忆计划。'
          ]
        },
        general: [
          '您好！我是专业的英语老师，有丰富的教学经验。我可以帮您制定个性化的学习计划，从基础语法到高级口语，从考试准备到实际应用。请告诉我您的学习目标和当前水平，我会为您设计合适的学习方案。',
          '英语学习需要科学的方法！我擅长因材施教，可以根据您的具体情况制定学习计划。无论是口语、听力、阅读还是写作，我都能为您提供专业的指导。请告诉我您希望重点提高哪个方面？',
          '很高兴为您提供英语辅导服务！我拥有丰富的教学经验，可以帮助您快速提升英语水平。请告诉我您的学习目标和当前水平，我会为您制定个性化的学习计划。'
        ]
      },
      '手工编织': {
        keywords: {
          '毛衣': [
            '毛衣编织需要选择合适的毛线和针号：\n1. 根据款式选择毛线材质和粗细\n2. 选择合适的针号，通常比毛线推荐针号小1-2号\n3. 从简单的平针开始，逐步学习花样编织\n4. 注意编织密度，确保成品尺寸合适\n\n您想学习哪种款式的毛衣？我可以为您推荐合适的毛线和针号。',
            '毛衣编织我来教您！\n1. 选择适合的毛线和针号\n2. 从基础针法开始练习\n3. 学习花样编织技巧\n4. 注意编织密度和尺寸\n\n您喜欢什么风格的毛衣？我可以为您推荐合适的编织方法。'
          ],
          '围巾': [
            '围巾是很好的入门项目：\n1. 使用粗毛线和粗针，编织速度快\n2. 选择简单的针法，如平针或双面针\n3. 注意编织密度，确保围巾柔软舒适\n4. 可以尝试不同的花样和颜色搭配\n\n您喜欢什么颜色的毛线？我可以教您多种针法和花样。',
            '围巾编织简单易学！\n1. 选择粗毛线，编织速度快\n2. 从平针开始，掌握基本技巧\n3. 学习花样编织，增加美观度\n4. 注意编织密度和长度\n\n您想编织什么风格的围巾？我可以为您推荐合适的针法。'
          ],
          '针法': [
            '基础针法包括：\n1. 平针 - 最基本的针法，适合初学者\n2. 反针 - 与平针配合，形成不同纹理\n3. 加针 - 增加针数，用于扩宽\n4. 减针 - 减少针数，用于收窄\n\n我建议从平针开始练习，掌握基本技巧后再学习花样。您想学习哪种针法？',
            '针法学习我来教您！\n1. 从平针开始，掌握基本技巧\n2. 学习反针，形成不同纹理\n3. 练习加针减针，控制形状\n4. 学习花样针法，增加美观度\n\n您想重点学习哪种针法？我可以为您详细演示。'
          ],
          '毛线': [
            '选择毛线要考虑：\n1. 材质 - 羊毛、棉线、混纺等\n2. 粗细 - 细线、中粗、粗线等\n3. 颜色 - 根据项目和个人喜好选择\n4. 品牌 - 选择质量可靠的品牌\n\n我建议初学者选择中粗毛线，容易编织且效果明显。您想编织什么项目？我可以为您推荐合适的毛线。',
            '毛线选择很重要！\n1. 根据项目选择合适材质\n2. 考虑毛线粗细和编织难度\n3. 选择喜欢的颜色和品牌\n4. 注意毛线质量和价格\n\n您想编织什么？我可以为您推荐合适的毛线类型。'
          ]
        },
        general: [
          '您好！我是手工编织爱好者，有丰富的编织经验。我可以教您从基础针法到复杂花样的各种编织技巧，让您享受编织的乐趣。请告诉我您想学习什么项目，我会为您提供详细的指导。',
          '手工编织是一门很有魅力的技艺！我擅长各种编织方法，从简单的围巾到复杂的毛衣都能教您。请告诉我您的编织经验，我会为您推荐合适的学习项目。',
          '很高兴为您提供编织指导！我拥有丰富的编织经验，可以教您各种针法和花样。请告诉我您想学习什么，我会为您制定详细的学习计划。'
        ]
      }
    };
  }

  async getAIResponse(skillName, userMessage, context = '') {
    try {
      // 优先使用豆包AI接口
      if (this.douBaoConfig.apiKey && this.douBaoConfig.apiKey !== 'your-doubao-api-key') {
        const douBaoResponse = await this.callDouBaoAPI(skillName, userMessage, context);
        if (douBaoResponse.success) {
          return douBaoResponse;
        }
      }
      
      // 如果豆包接口失败或未配置，使用内置智能回复
      const response = this.analyzeAndRespond(skillName, userMessage);
      return { success: true, data: response };
    } catch (error) {
      console.error('AI服务处理失败:', error);
      return {
        success: false,
        error: error.message,
        fallback: this.getFallbackResponse(skillName, userMessage)
      };
    }
  }

  /**
   * 调用豆包AI接口
   */
  async callDouBaoAPI(skillName, userMessage, context = '') {
    try {
      const systemPrompt = this.buildSystemPrompt(skillName);
      const userPrompt = this.buildUserPrompt(userMessage, context);

      const requestData = {
        model: this.douBaoConfig.model,
        messages: [
          {
            role: 'system',
            content: systemPrompt
          },
          {
            role: 'user',
            content: userPrompt
          }
        ],
        max_tokens: 800,
        temperature: 0.7,
        stream: false
      };

      console.log('调用豆包API:', { skillName, userMessage });

      const response = await axios.post(this.douBaoConfig.url, requestData, {
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${this.douBaoConfig.apiKey}`
        },
        timeout: 15000 // 15秒超时
      });

      console.log('豆包API返回:', response.data);

      if (response.data && response.data.choices && response.data.choices[0]) {
        const aiResponse = response.data.choices[0].message.content;
        return {
          success: true,
          data: aiResponse
        };
      } else {
        throw new Error('豆包API返回数据格式错误');
      }
    } catch (error) {
      console.error('豆包API调用失败:', error.message);
      return {
        success: false,
        error: error.message
      };
    }
  }

  analyzeAndRespond(skillName, userMessage) {
    const skillData = this.skillResponses[skillName] || this.skillResponses['电脑维修'];
    
    // 扩展关键词匹配，增加更多常见问题
    const extendedKeywords = {
      ...skillData.keywords,
      '价格': skillData.keywords['价格'] || ['关于价格，我需要了解具体情况才能给您准确报价。请告诉我您的具体需求，我会为您提供合理的价格方案。'],
      '费用': skillData.keywords['费用'] || ['费用根据服务类型和复杂程度而定。请详细描述您的需求，我会为您提供准确的费用估算。'],
      '时间': skillData.keywords['时间'] || ['我可以根据您的时间安排提供服务。请告诉我您希望的时间，我会尽量配合您的安排。'],
      '上门': skillData.keywords['上门'] || ['我可以提供上门服务，需要额外收取上门费。请告诉我您的地址，我会安排合适的时间。'],
      '什么时候': skillData.keywords['什么时候'] || ['我的工作时间比较灵活，可以根据您的需求安排。请告诉我您希望的时间，我会尽量配合。'],
      '过来': skillData.keywords['过来'] || ['我可以上门服务，请告诉我您的地址和希望的时间，我会安排合适的时间过去。'],
      '屏幕': skillData.keywords['屏幕'] || ['屏幕问题需要先确定具体故障。请描述一下屏幕的具体问题，我可以为您提供解决方案。'],
      '坏了': skillData.keywords['坏了'] || ['我理解您的担心。请详细描述一下故障现象，我会为您分析问题并提供解决方案。'],
      '修': skillData.keywords['修'] || ['我可以帮您维修。请告诉我具体的故障现象，我会为您提供专业的维修服务。'],
      '多少钱': skillData.keywords['多少钱'] || ['价格需要根据具体情况确定。请详细描述您的需求，我会为您提供合理的报价。']
    };
    
    // 检查关键词匹配
    for (const [keyword, responses] of Object.entries(extendedKeywords)) {
      if (userMessage.includes(keyword)) {
        const randomResponse = responses[Math.floor(Math.random() * responses.length)];
        return this.enhanceResponse(randomResponse, skillName);
      }
    }
    
    // 使用通用回复
    const generalResponses = skillData.general || this.skillResponses['电脑维修'].general;
    const randomResponse = generalResponses[Math.floor(Math.random() * generalResponses.length)];
    return this.enhanceResponse(randomResponse, skillName);
  }

  /**
   * 构建系统提示词
   */
  buildSystemPrompt(skillName) {
    return `你是一个专业的${skillName}技能提供者，拥有丰富的实战经验。请根据用户的问题提供专业、实用、易懂的回答。

回答要求：
1. 专业性强，体现你的技能水平和实战经验
2. 回答详细但不冗长，控制在200-300字之间
3. 语气亲切友好，像经验丰富的朋友在交流
4. 回答要有条理，使用编号或分点说明
5. 提供具体的操作步骤或解决方案
6. 如果用户的问题超出专业范围，礼貌说明并建议其他解决方案
7. 适当询问用户的具体情况，以便提供更精准的帮助
8. 体现专业性和实用性，让用户感受到你的专业价值

技能背景：${skillName}相关专业知识，包括理论知识和实战经验`;
  }

  /**
   * 构建用户提示词
   */
  buildUserPrompt(userMessage, context) {
    if (context) {
      return `对话上下文：${context}\n\n用户当前问题：${userMessage}`;
    }
    return userMessage;
  }

  enhanceResponse(baseResponse, skillName) {
    let enhancedResponse = baseResponse;
    
    // 根据技能类型添加专业建议
    const skillEnhancements = {
      '电脑维修': [
        '\n\n💡 专业建议：如果问题持续存在，建议您提供更详细的故障描述，我可以为您制定更精确的解决方案。',
        '\n\n🔧 服务承诺：提供3个月保修期，确保维修质量。',
        '\n\n📞 联系方式：如需上门服务，请提供您的地址和联系方式。'
      ],
      '英语辅导': [
        '\n\n📚 学习建议：建议制定每日学习计划，保持学习的连续性和系统性。',
        '\n\n🎯 个性化方案：我可以根据您的具体情况制定专属学习计划。',
        '\n\n📖 学习资源：我会为您推荐优质的学习材料和练习方法。'
      ],
      '手工编织': [
        '\n\n🧶 学习建议：建议从简单项目开始，逐步提高难度。',
        '\n\n🎨 创意指导：我可以教您各种花样和配色技巧。',
        '\n\n📏 技巧分享：掌握正确的针法和编织密度很重要。'
      ]
    };
    
    const enhancements = skillEnhancements[skillName] || skillEnhancements['电脑维修'];
    const randomEnhancement = enhancements[Math.floor(Math.random() * enhancements.length)];
    
    enhancedResponse += randomEnhancement;
    
    return enhancedResponse;
  }

  getFallbackResponse(skillName, userMessage) {
    const fallbackResponses = {
      '电脑维修': [
        '我理解您的电脑问题。根据您的描述，我建议先检查硬件连接，然后运行系统诊断。如果需要，我可以为您提供更详细的维修指导。',
        '电脑维修是我的专业领域。让我为您分析一下问题，并提供解决方案。您能详细描述一下具体的故障现象吗？',
        '电脑维修需要专业诊断。请告诉我具体的故障现象，我会为您提供针对性的解决方案和合理报价。',
        '我擅长各种电脑维修问题。请详细描述您的需求，我会为您提供专业的维修服务。'
      ],
      '英语辅导': [
        '英语学习需要系统性的方法。根据您的需求，我建议制定一个个性化的学习计划。您希望重点提高哪个方面？',
        '我很乐意帮助您提高英语水平。让我们从您的具体需求开始，制定合适的学习方案。',
        '英语学习需要科学的方法。请告诉我您的学习目标和当前水平，我会为您制定个性化的学习计划。',
        '我拥有丰富的英语教学经验。请告诉我您希望重点提高哪个方面，我会为您提供专业的指导。'
      ],
      '手工编织': [
        '手工编织是一门很有魅力的技艺。请告诉我您想学习什么项目，我会为您提供详细的指导。',
        '我很乐意教您编织技巧。请告诉我您的编织经验，我会为您推荐合适的学习项目。',
        '编织需要耐心和技巧。请告诉我您想学习什么，我会为您制定详细的学习计划。',
        '我拥有丰富的编织经验。请告诉我您的具体需求，我会为您提供专业的指导。'
      ]
    };

    const responses = fallbackResponses[skillName] || fallbackResponses['电脑维修'];
    return responses[Math.floor(Math.random() * responses.length)];
  }
}

module.exports = new AIService(); 